#ifndef BPLUSPLUS_H_
#define BPLUSPLUS_H_

#include "SequenceSet.h"
#include "IndexSet.h"
#include "Key.h"
#include "Trace.h"
#include <string>
#include <stack>

#define B_OK 0
#define B_ERROR -1
#define B_EXISTE -2
#define B_NO_EXISTE -3

class BPlusPlus 
{
	protected:
		// atributos
		std::string filename;
		unsigned int level;
		int root;
		int currentPage;
		unsigned int currentKey;
		int stopPage;
		unsigned int stopKey;
		int currentOperator;
		Key initialKeyCondition;
		Key finalKeyCondition;
		

		// Pila utilizada como buffer de paginas
		std::stack<Trace> stackPage;
		
		void addTrace(int offset, unsigned int pos);
		int getStackOffset();
		unsigned int getConditionKey(char* operador);
		int getFirstSequence();
		int getLastSequence();
		void getHighKey(int offset, Key *condition, Key *stop, int &posPageStop, unsigned int &posKeyStop);
		void getHighAndEqualKey(int offset, Key *condition, Key *stop, int &posPageStop, unsigned int &posKeyStop);
		void clearStack();
		void searchToAdd(Key *key);
		void searchToStart(Key *key);
		void newRoot(Key* keyPromoted, int nrrPromoted);
		Page* newLoadedSequencePage(int offset);
		Page* newLoadedIndexPage(int offset);

	public:
		// Constructor y destructor
		BPlusPlus();
		virtual ~BPlusPlus();
	
		/* Creacion del arbol, una vez creado no es necesario llamar al metodo open */
		int create(std::string fileName);

		/* Apertura del arbol */
		int open(std::string file);

		/* Cierre del arbol */
		void close();

		/* alta, baja y modificacion */
		int add(char* ptr, unsigned int size, int nrr);
		int update(char* ptr, unsigned int size, int newNrr);
		int erase(char* ptr, unsigned int size, int nrr);
		
		/*  consulta puntual */
		int get(char* ptr, unsigned int size);
		
		/* retorna el nivel del arbol */
		unsigned int getLevel();
		
		/* inicializa el iterador del arbol a partir de una clave y un operador*/
		void start(char* operador,char* ptr, unsigned int size);
		
		/* devuelve el siguiente id de la posicion actual */
		void next(Key* key);
		
		/* devuelve TRUE si esta al final de la secuencia inicializada segun el start*/
		bool hasNext();
		
		/* Remueve el archivo del indice */
		void Destroy(char *filename);

		// Devuelve el offset del minimo valor del arbol
		int Min();

		// Devuelve el offset maximo valor del arbol
		int Max();

};

#endif

 
